package org.jiuling.local.tools.util;

import org.jiuling.local.tools.convert.annotations.Alias;
import org.jiuling.local.tools.exception.LocalToolsException;
import org.jiuling.local.tools.exception.LocalToolsRuntimeException;
import org.jiuling.local.tools.verify.StringVerify;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Objects;

/**
 * 枚举扩展功能
 * @author 紫灵
 * @date 2021年11月03日 17时16分19秒
 */
@Deprecated
public class EnumUtil {
    /**
     * 私有构造方法，禁止创建对象
     */
    private EnumUtil(){};

    /**
     * 值映射为枚举
     * @param enumClass 枚举类
     * @param value 值
     * @param methodName 取值方法
     * @param <E> 对应枚举
     * @return 枚举
     */
    public static <E extends Enum<?>> E valueOfEnum(Class<E> enumClass, Object value, String methodName) throws LocalToolsException {
        // 获取枚举数组
        E[] es = enumClass.getEnumConstants();
        // 遍历枚举
        for (E e:es){
            try {
                Method method = e.getClass().getMethod(methodName);
                // 允许操作私有方法
                method.setAccessible(true);
                Object evalue = method.invoke(e);
                if(Objects.equals(evalue,value)){
                    return e;
                }
            } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException exc) {
                throw new LocalToolsException(exc.getLocalizedMessage());
            }
        }
        String name = String.valueOf(AnnotationUtil.getAnnotationValue(enumClass.getAnnotations(), Alias.class, "name"));
        if(StringVerify.isBlank(name)){
            name = "枚举";
        }
        throw new LocalToolsRuntimeException(name+"["+String.valueOf(value)+"]不存在！");
    }
}
